package com.puboot.common.util;

import java.math.BigDecimal;
import java.util.List;

/**
 * 铝冶炼
 * Created by chen on 2021/12/16.
 */
public class AluminumSmeltingUtil {


    /**
     * 计算 温室气体排放总量，单位为t
     *
     * @param eBurn             燃料燃烧排放量，单位为t
     * @param eRawMaterial      能源作为原材料用途的排放量，单位为t
     * @param eProcess          过程排放量，单位为t
     * @param ePurchaseElectric 购入的电力消费的排放量，单位为t
     * @param ePurchaseHeat     购入的热力消费的排放量，单位为t
     * @param eOutInputElectric 输出的电力排放量，单位为t
     * @param eOutInputHeat     输出的热力排放量，单位为t
     * @return
     */
    public static Double getE(Double eBurn, Double eRawMaterial, Double eProcess,
                              Double ePurchaseElectric, Double ePurchaseHeat, Double eOutInputElectric,
                              Double eOutInputHeat) {
        BigDecimal eOutInputElectricB = new BigDecimal(eOutInputElectric);
        BigDecimal eOutInputHeatB = new BigDecimal(eOutInputHeat);
        BigDecimal jsgc1 = GasDCUtil.allAdd(eBurn, eRawMaterial, eProcess, ePurchaseElectric, ePurchaseHeat);
        BigDecimal jsgc2 = jsgc1.subtract(eOutInputElectricB);
        BigDecimal jsgc3 = jsgc2.subtract(eOutInputHeatB);
        return jsgc3.doubleValue();
    }

    /**
     * 计算 燃料燃烧排放量
     *
     * @param ncvs 第i种化石燃料的平均低位发热量，对固体和液体燃料以GJ/t为单位，对气体燃料以GJ /104Nm3为单位
     * @param fcs  第i种化石燃料的净消耗量，对固体和液体燃料以t为单位，对气体燃料以104Nm3为单位
     * @param ccs  第i种化石燃料的单位热值含碳量，单位为t/GJ
     * @param ofs  第i种化石燃料的碳氧化率，单位为%
     * @return
     */
    public static Double getEBurn(List<String> ncvs, List<String> fcs, List<String> ccs, List<String> ofs) {
        BigDecimal result = new BigDecimal(0.0);
        BigDecimal cl2B = new BigDecimal(12);
        for (int i = 0; i < ncvs.size(); i++) {
            BigDecimal jsgc1 = GasDCUtil.allMul(Double.valueOf(ncvs.get(i)), Double.valueOf(fcs.get(i)),
                    Double.valueOf(ccs.get(i)), Double.valueOf(ofs.get(i)), 44.0);
            result = result.add(jsgc1.divide(cl2B, 10, BigDecimal.ROUND_HALF_UP));
        }
        return result.doubleValue();
    }

    /**
     * 计算 能源作为原材料用途的排放量，单位为t
     *
     * @param p 年度内的原铝产量，单位为t
     * @return
     */
    public static Double getERawMaterial(Double p) {
        return GasDCUtil.allMul(0.8932, p).doubleValue();
    }

    /**
     * 计算 过程排放量，单位为t
     *
     * @param p            年度内的原铝产量，单位为t
     * @param adCarbonates 年度内某种碳酸盐的消耗量，单位为t
     * @param efCarbonates 某种碳酸盐分解的二氧化碳排放因子
     * @param q            回收利用的二氧化碳气体体积，单位为104Nm3
     * @param pur          回收利用的二氧化碳气体的纯度，单位为%
     * @return
     */
    public static Double getEProcess(Double p, List<String> adCarbonates, List<String> efCarbonates, Double q, Double pur) {
        BigDecimal jsgc1 = GasDCUtil.allMul(0.25228, Double.valueOf(p));
        BigDecimal jsgc2 = new BigDecimal(0.0);
        for (int i = 0; i < adCarbonates.size(); i++) {
            BigDecimal jsgc = GasDCUtil.allMul(Double.valueOf(adCarbonates.get(i)), Double.valueOf(efCarbonates.get(i)));
            jsgc2 = jsgc2.add(jsgc);
        }
        BigDecimal jsgc3 = GasDCUtil.allMul(19.7, Double.valueOf(q), Double.valueOf(pur));
        BigDecimal jsgc4 = jsgc1.add(jsgc2);
        return jsgc4.subtract(jsgc3).doubleValue();
    }

    /**
     * 计算 购入的电力消费的排放量，单位为t
     *
     * @param adPurchaseElectric 年度内的购入电量，单位为MWh
     * @param efPurchaseElectric 区域电网年平均供电因子，单位为t/MWh
     * @return
     */
    public static Double getEPurchaseElectric(Double adPurchaseElectric, Double efPurchaseElectric) {
        return GasDCUtil.allMul(adPurchaseElectric, efPurchaseElectric).doubleValue();
    }

    /**
     * 计算 购入的热力消费的排放量，单位为t 或者 输出的热力排放量，单位为t
     *
     * @param adPurchaseHeatOrAdOutInputHeat 年度内的外购热力，单位为GJ    年度内的输出热力，单位为GJ
     * @return
     */
    public static Double getEPurchaseHeatOrEOutIputHeat(Double adPurchaseHeatOrAdOutInputHeat) {
        return GasDCUtil.allMul(0.11, adPurchaseHeatOrAdOutInputHeat).doubleValue();
    }

    /**
     * 计算 输出的电力排放量，单位为t
     *
     * @param adOutInputElectric 年度内的输出电量，单位为MWh
     * @param efOutInputElectric 区域电网年平均供电因子，单位为t/MWh
     * @return
     */
    public static Double getEOutputElectric(Double adOutInputElectric, Double efOutInputElectric) {
        return GasDCUtil.allMul(adOutInputElectric, efOutInputElectric).doubleValue();
    }
}
